<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>初识Docker | 十三不知</title><meta name="keywords" content="Docker"><meta name="author" content="张十三"><meta name="copyright" content="张十三"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="Docker简介 Docker的基本概念 Docker是什么 Docker是一种容器技术，容器是一种轻量级、可移植、自包含的软件打包技术，使应用程序几乎可以在任何地方以相同的方式运行。 容器来源于集装箱，二者的英文都是Container，集装箱解决了运输的难题，而Docker的中文意思就是码头工人，是用于管理集装箱的。Docker的图标就是集装箱，意思就是可以将软件以及要部署的东西像集装箱一样打包">
<meta property="og:type" content="article">
<meta property="og:title" content="初识Docker">
<meta property="og:url" content="http://zuori.gitee.io/zaker/2019/03/25/%E5%88%9D%E8%AF%86Docker/index.html">
<meta property="og:site_name" content="十三不知">
<meta property="og:description" content="Docker简介 Docker的基本概念 Docker是什么 Docker是一种容器技术，容器是一种轻量级、可移植、自包含的软件打包技术，使应用程序几乎可以在任何地方以相同的方式运行。 容器来源于集装箱，二者的英文都是Container，集装箱解决了运输的难题，而Docker的中文意思就是码头工人，是用于管理集装箱的。Docker的图标就是集装箱，意思就是可以将软件以及要部署的东西像集装箱一样打包">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg">
<meta property="article:published_time" content="2019-03-25T01:23:36.000Z">
<meta property="article:modified_time" content="2021-04-22T07:04:52.905Z">
<meta property="article:author" content="张十三">
<meta property="article:tag" content="Docker">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg"><link rel="shortcut icon" href="https://gitee.com/zuori/kaiscript/raw/master/images/20210325203813.png"><link rel="canonical" href="http://zuori.gitee.io/zaker/2019/03/25/%E5%88%9D%E8%AF%86Docker/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/zaker/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/zaker/',
  algolia: undefined,
  localSearch: undefined,
  translate: undefined,
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '天',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: {"limitCount":50,"languages":{"author":"作者: 张十三","link":"链接: ","source":"来源: 十三不知","info":"著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。"}},
  lightbox: 'fancybox',
  Snackbar: undefined,
  source: {
    jQuery: 'https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js',
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/css/justifiedGallery.min.css'
    },
    fancybox: {
      js: 'https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js',
      css: 'https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isanchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = { 
  isPost: true,
  isHome: false,
  isHighlightShrink: false,
  isToc: true,
  postUpdate: '2021-04-22 15:04:52'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          if (t === 'dark') activateDarkMode()
          else if (t === 'light') activateLightMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    })(window)</script><meta name="generator" content="Hexo 5.4.0"></head><body><div id="loading-box"><div class="loading-left-bg"></div><div class="loading-right-bg"></div><div class="spinner-box"><div class="configure-border-1"><div class="configure-core"></div></div><div class="configure-border-2"><div class="configure-core"></div></div><div class="loading-word">加载中...</div></div></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="author-avatar"><img class="avatar-img" src="https://gitee.com/zuori/kaiscript/raw/master/images/20210325192506.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data"><div class="data-item is-center"><div class="data-item-link"><a href="/zaker/archives/"><div class="headline">文章</div><div class="length-num">13</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/zaker/tags/"><div class="headline">标签</div><div class="length-num">11</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/zaker/categories/"><div class="headline">分类</div><div class="length-num">4</div></a></div></div></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/zaker/"><i class="fa-fw fas fa-home"></i><span> Home</span></a></div><div class="menus_item"><a class="site-page" href="/zaker/archives/"><i class="fa-fw fas fa-archive"></i><span> Archives</span></a></div><div class="menus_item"><a class="site-page" href="/zaker/tags/"><i class="fa-fw fas fa-tags"></i><span> Tags</span></a></div><div class="menus_item"><a class="site-page" href="/zaker/categories/"><i class="fa-fw fas fa-folder-open"></i><span> Categories</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="post-bg" id="page-header" style="background-image: url('https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg')"><nav id="nav"><span id="blog_name"><a id="site-name" href="/zaker/">十三不知</a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/zaker/"><i class="fa-fw fas fa-home"></i><span> Home</span></a></div><div class="menus_item"><a class="site-page" href="/zaker/archives/"><i class="fa-fw fas fa-archive"></i><span> Archives</span></a></div><div class="menus_item"><a class="site-page" href="/zaker/tags/"><i class="fa-fw fas fa-tags"></i><span> Tags</span></a></div><div class="menus_item"><a class="site-page" href="/zaker/categories/"><i class="fa-fw fas fa-folder-open"></i><span> Categories</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="post-info"><h1 class="post-title">初识Docker</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2019-03-25T01:23:36.000Z" title="发表于 2019-03-25 09:23:36">2019-03-25</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2021-04-22T07:04:52.905Z" title="更新于 2021-04-22 15:04:52">2021-04-22</time></span><span class="post-meta-categories"><span class="post-meta-separator">|</span><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/zaker/categories/%E4%BA%91%E5%8E%9F%E7%94%9F/">云原生</a></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-pv-cv" id="" data-flag-title="初识Docker"><i class="far fa-eye fa-fw post-meta-icon"></i><span class="post-meta-label">阅读量:</span><span id="busuanzi_value_page_pv"></span></span></div></div></div></header><main class="layout" id="content-inner"><div id="post"><article class="post-content" id="article-container"><h1>Docker简介</h1>
<h2 id="Docker的基本概念">Docker的基本概念</h2>
<h3 id="Docker是什么">Docker是什么</h3>
<p>Docker是一种容器技术，容器是一种轻量级、可移植、自包含的软件打包技术，使应用程序几乎可以在任何地方以相同的方式运行。</p>
<p>容器来源于集装箱，二者的英文都是Container，集装箱解决了运输的难题，而Docker的中文意思就是码头工人，是用于管理集装箱的。Docker的图标就是集装箱，意思就是可以将软件以及要部署的东西像集装箱一样打包起来，然后运行在任何你想运行的环境上，Docker 在容器的基础上，进行了进一步的封装，从文件系统、网络互联到进程隔离等等，极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。</p>
<p>用一句话概括：Docker是一种轻量虚拟化的容器技术，提供类似虚拟机的隔离功能，并使用了一种分层的联合文件系统技术管理镜像，能极大简化环境运维过程。</p>
<p><img src="https://gitee.com/zuori/kaiscript/raw/master/images/20210422143124.png" alt=""></p>
<p>当我们做开发的时候，只要在自己本地的环境上创建并测试号容器，无需任何修改就可以在生产系统的虚拟机、物理服务器或者公有云私有云主机上进行运行。</p>
<h3 id="Docker的基本组成">Docker的基本组成</h3>
<p>镜像（image）、容器（container）、仓库（registry）</p>
<p>理解了这三个概念，就是理解了Docker的整个生命周期</p>
<p><strong>A.</strong>  <strong>镜像</strong></p>
<p>操作系统分为内核和用户空间。 对于 Linux 而言， 内核启动后， 会挂载 root文件系统为其提供用户空间支持。 而 Docker 镜像（ Image） ， 就相当于是一个 root 文件系统。 比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。<br>
Docker 镜像是一个特殊的文件系统， 除了提供容器运行时所需的程序、 库、 资源、 配置等文件外， 还包含了一些为运行时准备的一些配置参数（ 如匿名卷、 环境变量、 用户等）。 镜像不包含任何动态数据， 其内容在构建之后也不会被改变。<br>
<strong>分层存储</strong><br>
因为镜像包含操作系统完整的 root 文件系统， 其体积往往是庞大的， 因此在 Docker 设计时， 就充分利用 Union FS 的技术， 将其设计为分层存储的架构。 所以严格来说， 镜像并非是像一个 ISO 那样的打包文件， 镜像只是一个虚拟的概念， 其实际体现并非由一个文件组成，而是由一组文件系统组成， 或者说， 由多层文件系统联合组成。</p>
<p>镜像构建时， 会一层层构建， 前一层是后一层的基础。 每一层构建完就不会再发生改变， 后一层上的任何改变只发生在自己这一层。 比如， 删除前一层文件的操作， 实际不是真的删除前一层的文件， 而是仅在当前层标记为该文件已删除。 在最终容器运行的时候， 虽然不会看到这个文件， 但是实际上该文件会一直跟随镜像。 因此， 在构建镜像的时候， 需要额外小心， 每一层尽量只包含该层需要添加的东西， 任何额外的东西应该在该层构建结束前清理掉。</p>
<p>分层存储的特征还使得镜像的复用、 定制变的更为容易。 甚至可以用之前构建好的镜像作为基础层， 然后进一步添加新的层， 以定制自己所需的内容， 构建新的镜像。</p>
<p><strong>B.</strong>   <strong>容器</strong></p>
<p>镜像（ Image ） 和容器（ Container ） 的关系， 就像是面向对象程序设计中的 类 和 实例一样， 镜像是静态的定义， 容器是镜像运行时的实体。 容器可以被创建、 启动、 停止、 删除、 暂停等。</p>
<p>容器的实质是进程， 但与直接在宿主执行的进程不同， 容器进程运行于属于自己的独立的 命名空间。 因此容器可以拥有自己的 root 文件系统、 自己的网络配置、 自己的进程空间， 甚至自己的用户 ID 空间。 容器内的进程是运行在一个隔离的环境里， 使用起来， 就好像是在一个独立于宿主的系统下操作一样。 这种特性使得容器封装的应用比直接在宿主运行更加安全。 也因为这种隔离的特性， 很多人初学 Docker 时常常会混淆容器和虚拟机。<br>
前面讲过镜像使用的是分层存储， 容器也是如此。 每一个容器运行时， 是以镜像为基础层，在其上创建一个当前容器的存储层， 我们可以称这个为容器运行时读写而准备的存储层为容器存储层。<br>
容器存储层的生存周期和容器一样， 容器消亡时， 容器存储层也随之消亡。 因此， 任何保存于容器存储层的信息都会随容器删除而丢失。<br>
按照 Docker 最佳实践的要求， 容器不应该向其存储层内写入任何数据， 容器存储层要保持无状态化。 所有的文件写入操作， 都应该使用 数据卷（ Volume） 、 或者绑定宿主目录， 在这些位置的读写会跳过容器存储层， 直接对宿主（ 或网络存储） 发生读写， 其性能和稳定性更高。<br>
数据卷的生存周期独立于容器， 容器消亡， 数据卷不会消亡。 因此， 使用数据卷后， 容器删除或者重新运行之后， 数据却不会丢失。</p>
<p><strong>C.</strong>  <strong>仓库</strong></p>
<p>镜像构建完成后， 可以很容易的在当前宿主机上运行， 但是， 如果需要在其它服务器上使用这个镜像， 我们就需要一个集中的存储、 分发镜像的服务，Docker Registry 就是这样的服务。<br>
一个 Docker Registry 中可以包含多个仓库（ Repository ）；每个仓库可以包含多个标签（ Tag ） ； 每个标签对应一个镜像。通常， 一个仓库会包含同一个软件不同版本的镜像， 而标签就常用于对应该软件的各个版本。 我们可以通过 &lt;仓库名&gt;:&lt;标签&gt; 的格式来指定具体是这个软件哪个版本的镜像。 如果不给出标签， 将以 latest 作为默认标签。</p>
<p>以 Ubuntu 镜像 为例， ubuntu 是仓库的名字， 其内包含有不同的版本标签， 如， 14.04 ,16.04 。 我们可以通过 ubuntu:14.04 ， 或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。 如果忽略了标签， 比如 ubuntu ， 那将视为 ubuntu:latest 。</p>
<p>仓库名经常以 两段式路径 形式出现， 比如 jwilder/nginx-proxy ， 前者往往意味着 Docker Registry 多用户环境下的用户名， 后者则往往是对应的软件名。 但这并非绝对， 取决于所使用的具体 Docker Registry 的软件或服务。<br>
<strong>Docker Registry</strong> <strong>公开服务</strong></p>
<p>Docker Registry 公开服务是开放给用户使用、 允许用户管理镜像的 Registry 服务。 一般这类公开服务允许用户免费上传、 下载公开的镜像， 并可能提供收费服务供用户管理私有镜像。</p>
<p>最常使用的 Registry 公开服务是官方的 Docker Hub， 这也是默认的 Registry， 并拥有大量的高质量的官方镜像。 除此以外， 还有 CoreOS 的 <a target="_blank" rel="noopener" href="http://Quay.io">Quay.io</a>， CoreOS 相关的镜像存储在这里；Google 的 Google Container Registry， Kubernetes 的镜像使用的就是这个服务。</p>
<p>由于某些原因， 在国内访问这些服务可能会比较慢。 国内的一些云服务商提供了针对 DockerHub 的镜像服务（ Registry Mirror ） ， 这些镜像服务被称为加速器。 常见的有 阿里云加速器、 DaoCloud 加速器 等。 使用加速器会直接从国内的地址下载 Docker Hub 的镜像， 比直接从 Docker Hub 下载速度会提高很多。 在 安装 Docker 一节中有详细的配置方法。</p>
<p>国内也有一些云服务商提供类似于 Docker Hub 的公开服务。 比如 时速云镜像仓库、 网易云镜像服务、 DaoCloud 镜像市场、 阿里云镜像库 等。<br>
<strong>私有 Docker Registry</strong></p>
<p>除了使用公开服务外， 用户还可以在本地搭建私有 Docker Registry。 Docker 官方提供了Docker Registry 镜像， 可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现， 足以支持docker 命令， 不影响使用。 但不包含图形界面， 以及镜像维护、 用户管理、 访问控制等高级功能。 在官方的商业化版本 Docker Trusted Registry 中， 提供了这些高级功能。</p>
<p>除了官方的 Docker Registry 外， 还有第三方软件实现了 Docker Registry API， 甚至提供了用户界面以及一些高级功能。 比如， VMWare Harbor 和 Sonatype Nexus。</p>
<h2 id="Docker-和虚拟机的区别">Docker 和虚拟机的区别</h2>
<p>Docker是一种虚拟化技术，而容器也是一种虚拟化技术，两者有什么区别呢。</p>
<p>下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后，在其上运行一个完整操作系统，在该系统上再运行所需应用进程；而容器内的应用进程直接运行于宿主的内核，容器内没有自己的内核，而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。</p>
<p>使用虚拟机运行多个相互隔离的应用时，如下图:</p>
<p><img src="https://gitee.com/zuori/kaiscript/raw/master/images/20210422143433.png" alt=""></p>
<p>从下到上理解上图:</p>
<p>· 基础设施(Infrastructure)。它可以是你的个人电脑，数据中心的服务器，或者是云主机。</p>
<p>· 主操作系统(Host Operating System)。你的个人电脑之上，运行的可能是MacOS，Windows或者某个Linux发行版。</p>
<p>· 虚拟机管理系统(Hypervisor)。利用Hypervisor，可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit，支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。</p>
<p>· 从操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用，则需要使用Hypervisor启动3个从操作系统，也就是3个虚拟机。这些虚拟机都非常大，也许有700MB，这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是，它们还会消耗很多CPU和内存。</p>
<p>· 各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话，则需要安装libpq-dev；如果你使用Ruby的话，应该需要安装gems；如果使用其他编程语言，比如Python或者Node.js，都会需要安装对应的依赖库。</p>
<p>· 应用。安装依赖之后，就可以在各个从操作系统分别运行应用了，这样各个应用就是相互隔离的。</p>
<p>使用Docker容器运行多个相互隔离的应用时，如下图:</p>
<p><img src="https://gitee.com/zuori/kaiscript/raw/master/images/20210422143551.png" alt=""></p>
<p>从下到上理解上图:</p>
<p>· 基础设施(Infrastructure)。它可以是你的个人电脑，数据中心的服务器，或者是云主机。</p>
<p>· 主操作系统(Host Operating System)。你的个人电脑之上，运行的可能是MacOS，Windows或者某个Linux发行版。</p>
<p>· 虚拟机管理系统(Hypervisor)。利用Hypervisor，可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit，支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。</p>
<p>· 从操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用，则需要使用Hypervisor启动3个从操作系统，也就是3个虚拟机。这些虚拟机都非常大，也许有700MB，这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是，它们还会消耗很多CPU和内存。</p>
<p>· 各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话，则需要安装libpq-dev；如果你使用Ruby的话，应该需要安装gems；如果使用其他编程语言，比如Python或者Node.js，都会需要安装对应的依赖库。</p>
<p>· 应用。安装依赖之后，就可以在各个从操作系统分别运行应用了，这样各个应用就是相互隔离的。</p>
<p>VM是在一台物理的主机上，虚拟出一套操作系统，将虚拟机虚拟出来之后，在其上安装了一个完整的操作系统。</p>
<p>容器不需要虚拟出硬件，也不需要虚拟出一个完整的操作系统，一个容器实际上仅仅是一个进程，多个容器运行，实际上是在共享下层的宿主机的内核。不像虚拟机是多个进程使用多个虚拟机里面的操作系统内核。</p>
<p>所以容器有轻量级，可移植，资源占用少的好处，</p>
<p>对于开发人员：Build Once,Run Anywhere,构建一次，可以在任何地方运行。</p>
<p>对于运维人员：Configure Once,Run Anything,配置一次，可以运行任何东西，配置好容器后，里面就可以放前端，数据库，后端之类的东西。</p>
<h2 id="为什么要使用Docker">为什么要使用Docker</h2>
<p>作为一种新兴的虚拟化方式， Docker 跟传统的虚拟化方式相比具有众多的优势。</p>
<ol>
<li>
<p>更高效的利用系统资源<br>
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销， Docker 对系统资源的利用率更高。 无论是应用执行速度、 内存损耗或者文件存储速度， 都要比传统虚拟机技术更高效。 因此， 相比虚拟机技术， 一个相同配置的主机， 往往可以运行更多数量的应用。</p>
</li>
<li>
<p>更快速的启动时间<br>
传统的虚拟机技术启动应用服务往往需要数分钟， 而 Docker 容器应用， 由于直接运行于宿主内核， 无需启动完整的操作系统， 因此可以做到秒级、 甚至毫秒级的启动时间。 大大的节约了开发、 测试、 部署的时间。</p>
</li>
<li>
<p>一致的运行环境<br>
开发过程中一个常见的问题是环境一致性问题。 由于开发环境、 测试环境、 生产环境不一致， 导致有些 bug 并未在开发过程中被发现。 而 Docker 的镜像提供了除内核外完整的运行时环境， 确保了应用运行环境一致性， 从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。</p>
</li>
<li>
<p>持续交付和部署<br>
对开发和运维（ DevOps） 人员来说， 最希望的就是一次创建或配置， 可以在任意地方正常运行。<br>
使用 Docker 可以通过定制应用镜像来实现持续集成、 持续交付、 部署。 开发人员可以通过Dockerfile 来进行镜像构建， 并结合 持续集成(Continuous Integration) 系统进行集成测试，而运维人员则可以直接在生产环境中快速部署该镜像， 甚至结合 持续部署(ContinuousDelivery/Deployment) 系统进行自动部署。<br>
而且使用 Dockerfile 使镜像构建透明化， 不仅仅开发团队可以理解应用运行环境， 也方便运维团队理解应用运行所需条件， 帮助更好的生产环境中部署该镜像。</p>
</li>
<li>
<p>更轻松的迁移<br>
由于 Docker 确保了执行环境的一致性， 使得应用的迁移更加容易。 Docker 可以在很多平台上运行， 无论是物理机、 虚拟机、 公有云、 私有云， 甚至是笔记本， 其运行结果是一致的。<br>
因此用户可以很轻易的将在一个平台上运行的应用， 迁移到另一个平台上， 而不用担心运行环境的变化导致应用无法正常运行的情况。</p>
</li>
<li>
<p>更轻松的维护和扩展<br>
Docker 使用的分层存储以及镜像的技术， 使得应用重复部分的复用更为容易， 也使得应用的维护更新更加简单， 基于基础镜像进一步扩展镜像也变得非常简单。 此外， Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像， 既可以直接在生产环境使用， 又可以作为基础进一步定制， 大大的降低了应用服务的镜像制作成本。</p>
</li>
</ol>
<h2 id="Docker的应用场景">Docker的应用场景</h2>
<p>Docker容器云则是使用Docker技术打造的一站式容器云服务平台，即CaaS(Containers as a Service)-容器即服务；可以将它简单看作为PaaS的升级版，使用Docker容器技术的CaaS平台功能更强大，使用灵活，部署更方便。</p>
<p>Docker容器作为一个全新的概念虽然广受关注，但是对于如何使用Docker，将容器技术真正落地用起来，目前估计很多人还没有非常清晰的思路。写这篇文章主要目的就是根据Docker容器的特点，描述Docker容器到底能用来干什么，达到抛砖引玉的目的。</p>
<p>可以认为容器云是处于IaaS和PaaS之间的位置，容器编排集成度越高越像PaaS，反之越像IaaS，据此这里简单地将Docker容器的使用分两大类：主机和服务。</p>
<h3 id="作为云主机使用">作为云主机使用</h3>
<p>相比虚拟机来说，容器使用的是一系列非常轻量级的虚拟化技术，使得其启动、部署、升级跟管理进程一样迅速，用起来灵活又感觉跟虚拟机一样没什么区别，所以有些人直接使用Docker的Ubuntu等镜像创建容器，当作轻量的虚拟机来使用。</p>
<p>特别是现在随着系统、软件越来越多，开发测试环境越来越复杂，仅仅靠多用户共享的这种方式节省资源带来的后果就是环境完全不可控。Docker容器的出现让每个人仅仅通过一个几KB的Dockerfile文件就能构建一个自定义的系统镜像，进而启动一个完整系统容器，让人人都能成为 DevOps。</p>
<p>容器云主机也完全能像普通主机一样随意启动、稳定运行、关机、重启，所以在上面随意搭建博客，小网站，VPN代理服务器等也完全不在话下。除了常用的托管服务业务，你完全可以自定义任何用法，包括在上面使用任何云服务提供商的云硬盘、云数据库，部署各种你需要的服务。</p>
<p>目前docker容器管理服务器在windows下运行需要借助Toolbox工具，虽然微软在2014年底就计划提供Windows Server容器镜像但目前还没有发布，所以想在docker里跑windows系统的容器的人还需要等待，希望到时候微软能裁剪出一种轻巧的windows基础镜像，毕竟容器本身就是一种更轻量级的系统。</p>
<h3 id="作为服务使用">作为服务使用</h3>
<p>如果你仅仅把docker容器当作一个轻量的固定虚拟机用，那其实只能算是另类用法，Docker容器最重要价值在于提供一整套平台无关的标准化技术，简化服务的部署、升级、维护，只要把需要运维的各种服务打包成标准的集装箱，就可以在任何能运行docker的环境下跑起来，达到开箱即用的效果，这个特点才是Docker容器风靡全球的根本原因。下面重点列举几个使用docker容器部署服务的场景</p>
<ol>
<li>
<p>web应用服务</p>
<p>Web应用服务是使用最广泛的一类服务，典型的架构是前端一个Tomcat + Java服务，后端mysql数据库。前端的Java web服务器是最适合使用Docker容器的，先将Java运行环境、web服务器直接打包成一个通用的基础docker镜像，之后再将自定义应用代码或编译程序包加入到该基础镜像中就能产生一个新的应用镜像，最后通过docker服务立马就能以容器的形式启动web应用服务。因为web应用程序一般是无状态的，随着业务访问量增减，用同样的镜像新建、销毁容器即可轻松实现伸缩（前面还需配上DNS域名或者负载均衡的服务），Docker容器的web服务例如下图所示。</p>
</li>
<li>
<p>持续集成和持续部署</p>
<p>互联网行业倡导敏捷开发，持续集成部署CI/CD便是最典型的开发模式。使用docker容器云平台，就能实现从代码编写完成推送到git/svn后，自动触发后端CaaS平台将代码下载、编译并构建成测试docker镜像，再替换测试环境容器服务，自动在Jenkins或者Hudson中运行单元/集成测试，最后测试通过后，马上就能自动将新版本镜像更新到线上，完成服务升级。整个过程全自动化，一气呵成，最大程度地简化了运维成本，而且保证线上、线下环境完全一致，而且线上服务版本与git/svn发布分支也实现统一</p>
</li>
<li>
<p>微服务架构使用</p>
<p>如果说上面两种应用场景还不足以体现出与传统的PaaS平台相比的巨大优势的话，那么对微服务的架构这种复杂又灵活的使用场景的无缝支持绝对具有革命意义。</p>
<p>微服务架构将传统分布式服务继续拆分解耦，形成一些更小服务模块，服务模块之间独立部署升级，这些特性与容器的轻量、高效部署不谋而合。如下图所示，每个容器里可以使用完全不同环境的镜像服务，容器启动即产生了一个独立的微服务主机节点（独立的网络ip），上层服务与下层服务之间服务发现通过环境变量注入、配置文件挂载等多种方式灵活解决，而且还可以直接将云平台提供的各种云服务与自定义的微服务整合组成一个强大的服务集群。</p>
<p>更重要的是，拥有如此多服务的集群环境迁移、复制也非常轻松，只需选择好各服务对应的docker服务镜像、配置好相互之间访问地址就能很快搭建出一份完全一样的新集群</p>
</li>
</ol>
</article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="mailto:undefined">张十三</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="http://zuori.gitee.io/zaker/2019/03/25/%E5%88%9D%E8%AF%86Docker/">http://zuori.gitee.io/zaker/2019/03/25/%E5%88%9D%E8%AF%86Docker/</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="http://zuori.gitee.io/zaker" target="_blank">十三不知</a>！</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/zaker/tags/Docker/">Docker</a></div><div class="post_share"><div class="addthis_inline_share_toolbox"></div><script src="//s7.addthis.com/js/300/addthis_widget.js#pubid=null" async="async"></script></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-full"><a href="/zaker/2019/04/25/YAML%E8%AF%AD%E6%B3%95/"><img class="prev-cover" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg" onerror="onerror=null;src='/zaker/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">YAML语法简介</div></div></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="card-info-avatar is-center"><img class="avatar-img" src="https://gitee.com/zuori/kaiscript/raw/master/images/20210325192506.jpg" onerror="this.onerror=null;this.src='/zaker/img/friend_404.gif'" alt="avatar"/><div class="author-info__name">张十三</div><div class="author-info__description"></div></div><div class="card-info-data"><div class="card-info-data-item is-center"><a href="/zaker/archives/"><div class="headline">文章</div><div class="length-num">13</div></a></div><div class="card-info-data-item is-center"><a href="/zaker/tags/"><div class="headline">标签</div><div class="length-num">11</div></a></div><div class="card-info-data-item is-center"><a href="/zaker/categories/"><div class="headline">分类</div><div class="length-num">4</div></a></div></div><a class="button--animated" id="card-info-btn" href="http://zuori.gitee.io/zaker"><i class="fab fa-github"></i><span>Follow Me</span></a></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn card-announcement-animation"></i><span>公告</span></div><div class="announcement_content">记录一点东西的地方</div></div><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span></div><div class="toc-content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link"><span class="toc-number">1.</span> <span class="toc-text">Docker简介</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#Docker%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5"><span class="toc-number">1.1.</span> <span class="toc-text">Docker的基本概念</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Docker%E6%98%AF%E4%BB%80%E4%B9%88"><span class="toc-number">1.1.1.</span> <span class="toc-text">Docker是什么</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Docker%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BB%84%E6%88%90"><span class="toc-number">1.1.2.</span> <span class="toc-text">Docker的基本组成</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Docker-%E5%92%8C%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-number">1.2.</span> <span class="toc-text">Docker 和虚拟机的区别</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E4%BD%BF%E7%94%A8Docker"><span class="toc-number">1.3.</span> <span class="toc-text">为什么要使用Docker</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Docker%E7%9A%84%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF"><span class="toc-number">1.4.</span> <span class="toc-text">Docker的应用场景</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BD%9C%E4%B8%BA%E4%BA%91%E4%B8%BB%E6%9C%BA%E4%BD%BF%E7%94%A8"><span class="toc-number">1.4.1.</span> <span class="toc-text">作为云主机使用</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BD%9C%E4%B8%BA%E6%9C%8D%E5%8A%A1%E4%BD%BF%E7%94%A8"><span class="toc-number">1.4.2.</span> <span class="toc-text">作为服务使用</span></a></li></ol></li></ol></li></ol></div></div><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/zaker/2021/03/30/Kubernetes%E9%9B%86%E7%BE%A4%E7%9B%91%E6%8E%A7%E4%B9%8B%20Metrics%20Server/" title="Kubernetes集群监控之 Metrics Server"><img src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg" onerror="this.onerror=null;this.src='/zaker/img/404.jpg'" alt="Kubernetes集群监控之 Metrics Server"/></a><div class="content"><a class="title" href="/zaker/2021/03/30/Kubernetes%E9%9B%86%E7%BE%A4%E7%9B%91%E6%8E%A7%E4%B9%8B%20Metrics%20Server/" title="Kubernetes集群监控之 Metrics Server">Kubernetes集群监控之 Metrics Server</a><time datetime="2021-03-30T06:46:36.000Z" title="发表于 2021-03-30 14:46:36">2021-03-30</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/zaker/2021/03/26/RabbitMq%E5%9F%BA%E7%A1%80%E4%BD%BF%E7%94%A8/" title="RabbitMq学习笔记"><img src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg" onerror="this.onerror=null;this.src='/zaker/img/404.jpg'" alt="RabbitMq学习笔记"/></a><div class="content"><a class="title" href="/zaker/2021/03/26/RabbitMq%E5%9F%BA%E7%A1%80%E4%BD%BF%E7%94%A8/" title="RabbitMq学习笔记">RabbitMq学习笔记</a><time datetime="2021-03-26T01:46:36.000Z" title="发表于 2021-03-26 09:46:36">2021-03-26</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/zaker/2021/03/25/K8s%E5%8F%AF%E8%A7%86%E5%8C%96%E7%9B%91%E6%8E%A7%E4%B9%8B-Weave%20Scope/" title="Kubernetes集群可视化监控之-Weave Scope"><img src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg" onerror="this.onerror=null;this.src='/zaker/img/404.jpg'" alt="Kubernetes集群可视化监控之-Weave Scope"/></a><div class="content"><a class="title" href="/zaker/2021/03/25/K8s%E5%8F%AF%E8%A7%86%E5%8C%96%E7%9B%91%E6%8E%A7%E4%B9%8B-Weave%20Scope/" title="Kubernetes集群可视化监控之-Weave Scope">Kubernetes集群可视化监控之-Weave Scope</a><time datetime="2021-03-25T11:46:36.000Z" title="发表于 2021-03-25 19:46:36">2021-03-25</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/zaker/2021/03/25/Linux%E5%B0%86%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%E5%8A%A0%E5%85%A5sudo%E7%BB%84/" title="Linux将一般用户加入sudo组"><img src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg" onerror="this.onerror=null;this.src='/zaker/img/404.jpg'" alt="Linux将一般用户加入sudo组"/></a><div class="content"><a class="title" href="/zaker/2021/03/25/Linux%E5%B0%86%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%E5%8A%A0%E5%85%A5sudo%E7%BB%84/" title="Linux将一般用户加入sudo组">Linux将一般用户加入sudo组</a><time datetime="2021-03-25T11:46:36.000Z" title="发表于 2021-03-25 19:46:36">2021-03-25</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/zaker/2021/03/03/Kubectl%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/" title="kubectl 基本使用"><img src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/img/default.jpg" onerror="this.onerror=null;this.src='/zaker/img/404.jpg'" alt="kubectl 基本使用"/></a><div class="content"><a class="title" href="/zaker/2021/03/03/Kubectl%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/" title="kubectl 基本使用">kubectl 基本使用</a><time datetime="2021-03-03T11:46:36.000Z" title="发表于 2021-03-03 19:46:36">2021-03-03</time></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">&copy;2020 - 2021 By 张十三</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/zaker/js/utils.js"></script><script src="/zaker/js/main.js"></script><script>var preloader = {
  endLoading: () => {
    document.body.style.overflow = 'auto';
    document.getElementById('loading-box').classList.add("loaded")
  },
  initLoading: () => {
    document.body.style.overflow = '';
    document.getElementById('loading-box').classList.remove("loaded")

  }
}
window.addEventListener('load',preloader.endLoading())</script><div class="js-pjax"></div><script defer="defer" id="ribbon" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-ribbon.min.js" size="150" alpha="0.6" zIndex="-1" mobile="false" data-click="false"></script><script defer="defer" id="fluttering_ribbon" mobile="true" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-fluttering-ribbon.min.js"></script><script id="canvas_nest" defer="defer" color="0,0,255" opacity="0.7" zIndex="-1" count="99" mobile="false" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-nest.min.js"></script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>